package com.dufang.ThreadWaitAndNotify;

/**
 * @ClassName:BaoZiPu
 * @Description 定义包子铺.一个线程生产，一个线程消费，
 *              wait和notify方法需要所对象调用，所以需要用到同步代码块中，而且必须是同一个锁对象。
 *              
 *              count和flag可以定义成包装类，记得给他们手动赋值，不然对于本案例来说，容易出现空指针异常
 * @Author Administrator
 * @Date 2025/7/7/007 15:34
 * @Version 1.0
 **/
public class BaoZiPu {
    //代表包子的count
    private int count;
    //代表是否有包子的flag
    private boolean flag;

    public BaoZiPu(){}

    public BaoZiPu(int count, boolean flag) {
        this.count = count;
        this.flag = flag;
    }

  /*  public void setCount(){
        count++;
        System.out.println("生产了。。。第"+count+"个包子");
    }*/
    public synchronized void setCount(){
        //1、判断flag是否为true,如果是true,证明有包子，生产线程等待
        if (this.flag== true) {
            try {
                this.wait();
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }
        //2、如果flag为false,证明没有包子，开始生产
        count++;
        //3、改变flag状态，为true,证明生产完了，有包子了
        this.flag=true;
        //4、唤醒消费线程
        this.notify();
        System.out.println("生产了。。。第"+count+"个包子");
    }
    /*改造成消费包子方法
       直接输出count*/
    /*public void getCount(){
        System.out.println("消费了。。。第"+count+"个包子");
    }*/
    public synchronized void getCount(){
        //1、判断flag是否为false,如果是false，证明没有包子，消费线程等待
        if(this.flag==false){
            try{
                this.wait();
            }catch (InterruptedException e){
                throw new RuntimeException(e);
            }
        }

        //2、如果flag为true,证明有包子，开始消费
        //baoZiPu.getCount();//可将这里的同步代码放进getCount里面
        //3、改变flag状态，为false,证明消费完了，没有包子了
        this.flag=false;
        //4、唤醒生产线程
        this.notify();
        System.out.println("消费了。。。第"+count+"个包子");
    }

    public boolean isFlag(){
        return flag;
    }

    public void setFlag(boolean flag){
        this.flag=flag;
    }
}
